Flutter Intents/Navigator
在Android中,Intents有两个主要用例:在Activity之间导航,以及与组件通信。
在Flutter中,没有Intent概念,在屏幕之间导航,使用Navigator和Routes。
>在Flutter中,导航屏幕有两种方式:1、先配置路由。2、后配置路由
先配置路由
1.1、配置路由
1.2、使用路由导航屏幕
后配置路由
2、在使用路由时配置路由
3、退出页面
4、导航时携带数据
5、全篇汇总效果展示
Navigator.pop(context);
先配置路由
1.1、配置路由
routes: {
'secondPage': (BuildContext context) => SecondPage(),
'sample page': (BuildContext context) => SecondPage(),
},
1.2、使用路由导航屏幕
Navigator.pushNamed(context, 'secondPage');
后配置路由
2.1、在使用路由时配置路由
//使用路由时创建路由
Navigator.push(context, new MaterialPageRoute(builder: (context) => SecondPage()));
3、退出页面
Navigator.pop(context);
>全部示例
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
routes: {
'secondPage': (BuildContext context) => SecondPage(),
'sample page': (BuildContext context) => SecondPage(),
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
RaisedButton(
color: Colors.blueAccent,
onPressed: () {
Navigator.pushNamed(context, 'secondPage');
},
textColor: Colors.white,
child: Text('go to new page!'),
shape: RoundedRectangleBorder(
borderRadius:BorderRadius.circular(10))
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SecondPage'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('return'))
],
),
),
);
}
}
4、导航时携带数据
案例介绍:页面一跳转到页面2,在页面2填写数据,点击按钮返回到页面1,在页面1接收数据后弹出对话框显示数据,对话框点击确定或取消按钮后关闭对话框。
获取输入框数据
TextField(
decoration: InputDecoration(
hasFloatingPlaceholder: true,
labelText: 'label',
border: OutlineInputBorder()),
onSubmitted: (content) {
//do something.
},
onChanged: (content) {
inputContent = content;
},
),
将数据返回上个页面
Navigator.pop(context, [
{
'content': inputContent,
'tip': 'hello'
}
]);
接收数据显示对话框
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => SecondPage()))
.then<Map>((value) {
/*
接收数据
弹出对话框
*/
showDialog(
context: context,
child: AlertDialog(
title: Text('从上个页面返回的数据'),
content: Text('${value.toString()}'),
contentPadding: EdgeInsets.all(10),
actions: <Widget>[
RaisedButton(
color: Colors.blue,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
child: Text('确定'),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10))),
RaisedButton(
color: Colors.grey,
textColor: Colors.white,
onPressed: () {
Navigator.of(context).pop();
},
child: Text('取消'),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10))),
],
),
);
关闭对话框
//关闭对话框
Navigator.of(context).pop();
5、全篇汇总效果展示
未完待续。。。